# -*- coding: utf-8 -*-
"""
Created on Thu Aug 24 20:51:56 2023

@author: skunk69
"""

import json

chinese_name = u'汉密顿抑郁量表'
english_name = 'Hamilton Depression Scale'
abbreviation = 'HAMD'
category = u'精神病学临床量表'

outline = u"""汉密顿抑郁量表（Hamilton Rating Scale for Depression，HRSD，Hamilton Depression Rating Scale，HAMD）由Hamilton于1960年编制，是临床上评定抑郁状态时应用得最为普遍的量表。本量表有17项，21项和24项等3种版本，本测试采用的是24项版本。"""

instruction = u""""""

with open('HAMD.txt','r',encoding='utf-8') as f:
    lines = f.readlines()
    f.close()

items = {}
for num,line in enumerate(lines[0:24]):
    _,value = line.strip().split('）',maxsplit=1)
    items[num+1] = value.strip()
    
items_definition = {}
for num,line in enumerate(lines[24:48]):
    _,value = line.strip().split('）',maxsplit=1)
    items_definition[num+1] = value.strip()

count = []
for num,line in enumerate(lines[48::]):
    str = '0 '
    if str in line:count.append(num)

lines_rating = []
for i in range(len(count)-1):
    lines_rating.append(lines[count[i]+48:count[i+1]-1+48])
lines_rating.append(lines[count[-1]+48::])

rating_standard = {}
rating = {}
rating_str = [u'无',u'轻度',u'中度',u'重度',u'极重']
score_rules = {}
for i in range(len(lines_rating)):
    item = {}
    item[i+1] = items[i+1]
    rate = {}
    rate_str = []
    score = []
    for line in lines_rating[i]:
        k,v = line.strip().split()
        rate[k] = v.strip()
        score.append(int(k))
        rate_str.append(rating_str[int(k)])
    rating_standard[i+1] = [item,rate]
    rating[i+1] = rate_str
    score_rules[i+1] = score

reverse_items = []
"""
HAMD可归纳为7类因子结构：
（1）焦虑/躯体化，[10,11,12,13,15,17]
（2）体重，[16]
（3）认识障碍，[2,3,9,19,20,21]
（4）日夜变化，[18]
（5）阻滞，[1,7,8,14]
（6）睡眠障碍，[4,5,6]
（7）绝望感，[22,23,24]
"""
scales = [u'焦虑/躯体化',u'体重',u'认识障碍',u'日夜变化',u'阻滞',u'睡眠障碍',u'绝望感']
scales_items = [
    [10,11,12,13,15,17],# 焦虑/躯体化
    [16],# 体重
    [2,3,9,19,20,21],# 认识障碍
    [18],# 日夜变化
    [1,7,8,14],# 阻滞
    [4,5,6],# 睡眠障碍
    [22,23,24],# 绝望感
    ]

# check scales_items
print(f'scale length={[len(l) for l in scales_items]}')

check = []
for l in scales_items:
    check = check+l
print(f'len(check)={len(check)}')

# complementary set
check_set = {i for i in sorted(check)}^{i for i in range(1,25)}
print(f'complementary set= {check_set}')

factors = []
factors_scales = []

contents = {
    'instruction':instruction,
    'items':items,
    'items_definition':items_definition,
    'rating_standard':rating_standard,
    'reverse_items':reverse_items,
    'scales':scales,
    'scales_items':scales_items,
    'factors':factors,
    'factors_scales':factors_scales,
    'rating':rating,
    'score_rules':score_rules       
    }

implementation = u"""适用于具有抑郁症状的成年病人。
一般采用交谈与观察的方式，最好由两名或以上的评定员进行评定。
评定时间范围：入组时，评定当时或入组前一周的情况，治疗后2～6周，以同样方式，对入组患者再次评定，比较治疗前后的症状和病情的变化。其中汉密顿抑郁量表中的第8、9、11项，依据对患者的观察进行评定，其余各项则根据患者自己的口头叙述评分，其中第1项需要两者兼顾，另外第7和22项，尚需向患者家属或病房工作人员收集资料，而第16项最好是根据体重记录，也可依据病人主诉及其家属或病房的工作人员所提供的资料进行评定。"""

reliability = u"""评定者经严格训练后，可取得极好的一致性。Hamilton本人报告，对70例抑郁患者的评定结果，评定者间的信度为0.90。全国协作组联合检查，两评定者间的一致性相当好，其总分评定的信度系数为0.88~0.99，P<0.01。"""
validity = u"""HAMD总分能较好地反映疾病严重程度，国外报道，该量表与GAS的相关度为0.94以上。国内资料报道，对抑郁症的评定，在反映临床症状严重程度的经验真实性系数为0.92。"""
measurements = {'reliability':reliability,'validity':validity}

interpretation = u"""HAMD以总粗分和因子分两种方式计分。
总分能较好地反映病情严重程度的指标，即病情越轻，总分越低，病情越重，总分越高。按照Davis的划界分，24项版本总分超过35分，可能为严重抑郁；超过20分，可能是轻度或中度抑郁；如小于8分，患者就没有抑郁症状。用于疗效评定时，与基线比较HAMD总分减值大于50%为有效。
因子分可以更为简捷清晰地反映病人的实际特点。"""

applications = u"""HAMD评定方法简便，标准明确，便于掌握，可以用于抑郁症、躁郁症、神经症等的抑郁症状的评定，但是不能鉴别焦虑症。HAMD在抑郁量表中，作为最标准者之一，如果发展新的抑郁量表，往往应以HAMD作平行效度检验工具。"""

this_scale = {
    'chinese_name':chinese_name,
    'english_name':english_name,
    'abbreviation':abbreviation,
    'category':category,
    'outline':outline,
    'contents':contents,
    'implementation':implementation,
    'measurements':measurements,
    'interpretation':interpretation,
    'applications':applications    
    }

with open(abbreviation+'.json','w+',encoding='utf-8') as f:
    json.dump(this_scale,f,indent=2,ensure_ascii=False)